package main

import "fmt"

/*
   @Time : 2019/5/16 16:52 
   @Author : ff
*/

func main() {
	deferIt5()
}

/**
  错误做法
  结果：5555

   defer语句携带的表达式语句中的那个匿名函数包含了对外部（确切地说，是该defer语句之外）的变量的使用。
   注意，等到这个匿名函数要被执行（且会被执行4次）的时候，包含该defer语句的那条for语句已经执行完毕了。
   此时的变量i的值已经变为了5。因此该匿名函数中的打印函数只会打印出5。
 */
func deferIt4() {
	for i := 1; i < 5; i++ {
		defer func() {
			fmt.Print(i)
		}()
	}
}

/**
 正确做法
 */
func deferIt5() {
	for i := 1; i < 5; i++ {
		defer func(n int) {
			fmt.Print(n)
		}(i)
	}
}